package com.by.common.controller;

import com.by.common.bean.ResultBean;
import com.by.common.exception.ValidateException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author wang
 * @version 版本号 ${}
 * @className BaseController  抽象类 定义了处理请求的基础逻辑
 * 该类主要用于被其他控制器类继承，以实现统一的行为规范
 * @日期 2024/9/5 14:24
 * @since jdk1.8
 */
public abstract class BaseController {
    /**
     * 成功
     */
    private final int SUCCESS = 200;
    /**
     * 失败
     */
    private final int FAIL = 0;
    

        /**
     * 将给定的参数封装成一个ResultBean对象并返回
     *
     * @param code 状态码，用于表示操作是否成功
     * @param msg  提示信息，提供关于操作结果的描述
     * @param data 数据对象，可以是任意类型的数据
     * @return 返回一个ResultBean对象，该对象包含了状态码、提示信息以及数据对象
     */
    ResultBean convert(int code, String msg, Object data) {
        return new ResultBean(code, msg, data);
    }
    
    /**
     * 构建一个表示操作成功的ResultBean对象无数据
     *
     * @param msg 成功的提示信息
     * @return 表示操作成功的ResultBean对象
     */
    protected ResultBean success(String msg) {
        return convert(SUCCESS, msg, null);
    }
    
    /**
     * 构建一个表示操作成功的ResultBean对象有数据
     *
     * @param msg  成功消息
     * @param data 数据 对象数据
     * @return 表示操作成功，同时包含传入的消息和数据ResultBean对象
     */
    protected ResultBean success(String msg, Object data) {
        return convert(SUCCESS, msg, data);
    }
    
    
    /**
     * 创建一个表示操作失败的ResultBean对象
     *
     * @param msg 失败的提示信息，用于说明失败的原因
     * @return 返回一个ResultBean对象，其中包含失败状态和相关提示信息
     * <p>
     * 此方法用于统一处理操作失败的情景，通过传入失败原因，可以生成一个标准的失败响应对象
     */
    protected ResultBean fail(String msg) {
        return convert(FAIL, msg, null);
    }
    
    /**
     * 创建一个表示操作失败的ResultBean对象
     *
     * @param msg  错误消息，用于描述失败的原因
     * @param data 附加数据，可以是任何类型，用于携带额外的信息
     * @return 返回一个ResultBean对象，表示操作失败
     */
    protected ResultBean fail(String msg, Object data) {
        return convert(FAIL, msg, data);
    }
    
    /**
     * 保存结果方法
     *
     * @param rs 操作结果代码，用于判断操作是否成功
     * @return 返回一个ResultBean对象，包含操作结果的信息
     * 如果rs等于1，表示操作成功，返回成功的信息；
     * 否则，返回失败的信息
     */
    protected ResultBean saveResult(int rs) {
        return rs == 1 ? success("保存成功") : fail("保存失败");
    }
    
    /**
     * 根据影响行数更新结果状态
     *
     * @param rs 影响的行数，用于判断更新操作是否成功
     * @return ResultBean 返回操作结果对象，包含操作状态和消息
     */
    protected ResultBean updateResult(int rs) {
        // 判断影响的行数，如果为1，则认为更新成功，否则失败
        return rs == 1 ? success("修改成功") : fail("修改失败");
    }
    
    /**
     * 根据删除操作的结果码执行删除操作
     *
     * @param rs 删除操作的结果码，通常来源于数据库操作
     * @return 返回一个ResultBean对象，表示删除操作的结果
     * 如果rs等于1，表示删除成功，返回成功结果Bean
     * 否则，表示删除失败，返回失败结果Bean
     */
    protected ResultBean deleteResult(int rs) {
        return rs == 1 ? success("删除成功") : fail("删除失败");
    }
    
    
    protected void validate(BindingResult result) {
        //获取验证信息
        List<FieldError> fieldErrors = result.getFieldErrors();
        
        if (fieldErrors.size() > 0) {
            Map<String, String> error = new HashMap<>();
            
            //遍历错误字段
            fieldErrors.forEach(el -> {
                error.put(el.getField(), el.getDefaultMessage());
            });
            
            //将异常信息抛给虚拟机
            throw new ValidateException(error);
        }
    }
}
